#include "DL_ISDU.h"
#include "Type_Define.h"
#include "Data_Buffer.h"
#include "DL_MH.h"
#include "My_PARAM.h"
#include <string.h>
#include "DL_Service.h"
ISDU_STATE_TYPE ISDU_STATE;

uint8_t ISDUBuffer_Pointer;
uint8_t ISDU_Len;// ISDU数据长度，在Check_ISDU中计算，注意ISDU_Len不一定等于ISDUBuffer_Pointer，因为OD长度可能大于1
 
BOOL ISDURespStart_BOOL=False; //ISDU 是否开始回复开关
 
uint8_t FlowCtrl_expected; //期望的FlowCtrl

void Init_ISDU(void){
    ISDU_STATE=ISDU_Inactvie_0;
}

//转移函数T的声明

void DL_ISDU_T2(void);
void DL_ISDU_T3(void);

void DL_ISDU_T4(void);
void DL_ISDU_T5(void);

void DL_ISDU_T6(void);

void DL_ISDU_T7(void);
void DL_ISDU_T8(void);
void DL_ISDU_T14(void);

 

void DL_ISDU_T9_10_11(void);
void DL_ISDU_T13_15_16(void);

//对接收的ISDU进行Check，并计算ISDU_Len
BOOL Check_ISDU(void){
	   //计算ISDU_len
	     uint8_t LEN=ISDUBuferIn[0]&0x0F;
	     if(LEN==0x01){
				    ISDU_Len=ISDUBuferIn[1];
			 }else{
				   ISDU_Len=LEN;
			 }
			 
			 uint8_t Seed=ISDUBuferIn[0];
			 for(uint8_t  i=1;i<ISDU_Len;i++){
				     Seed=Seed^ISDUBuferIn[i];
			 }
			 if(Seed==0){
				    return True;  //无错 NO_ERROR
			 }else{
				   return False;  //出错 ERROR
			 }
	
}


//输入事件函数********************
void Event_IH_Conf_ACTIVE(void){
    if(ISDU_STATE==ISDU_Inactvie_0){
        ISDU_STATE=ISDU_Idle_1;
        //DL_ISDU_T1();
    }
}

void Event_IH_Conf_INACTIVE(void){
    if(ISDU_STATE ==ISDU_Idle_1){
        ISDU_STATE=ISDU_Inactvie_0;
        //DL_ISDU_T12();
    }
}

void Event_ISDUStart(void){
    if(ISDU_STATE==ISDU_Idle_1){
        ISDU_STATE=ISDU_ISDURequest_2;
        DL_ISDU_T2();

    }
}


void Event_ISDUWrite(void){
    if(ISDU_STATE==ISDU_ISDURequest_2){
        DL_ISDU_T3();
    }
}


//此事件取代了ISDURecComplete和ISDURead(ISDUWait_3状态)
void Event_ISDURecComplete_Or_Read(void){
    if(ISDU_STATE==ISDU_ISDURequest_2){
        ISDU_STATE=ISDU_ISDUWait_3;
			//判断ISDU是否有错
			 if (Check_ISDU()){ //如果无错误
				      DL_ISDU_T4();
			 }else{
				     Event_ISDUError_BOOL();   //ISDU的Check出错 Event_MH_Ready();
        return;  
			 }
       
    }else if(ISDU_STATE==ISDU_ISDUWait_3 ){
			   
			      
			      if(ISDURespStart_BOOL==True){	//这个是异步的 由用户主动控制,ISDU开始回复
							    Event_ISDURespStart();
			    	}	else{
                 DL_ISDU_T5();
						}							
				 
			}
}

 

void Event_ISDUAbort(void){
 
        ISDU_STATE=ISDU_Idle_1;
        DL_ISDU_T9_10_11();
  

   
}

void Event_ISDUError_BOOL(void){
 
        ISDU_STATE=ISDU_Idle_1;
        DL_ISDU_T13_15_16();

}


//此事件仅仅被用于状态ISDUResponse_4的ISDURead
void Event_ISDURead(void){
	   
 

    if(ISDU_STATE==ISDU_ISDUResponse_4){
        DL_ISDU_T7();
        return;
    }
}

//////虽然由外部输入事件，由单片机主动控制，但不能显式调用，得通过开关变量调用
void Event_ISDURespStart(void){
    if(ISDU_STATE==ISDU_ISDUWait_3){
        ISDU_STATE=ISDU_ISDUResponse_4;
        DL_ISDU_T6();
        return;
    }
}


//此事件兼具Event_ISDUSendComplete和ISDURead(ISDU_Idle_1状态)功能，根据ISDU不同状态有不同动作
void Event_ISDU_Idle(void){
	 
	  if(ISDU_STATE==ISDU_ISDUResponse_4){  //ISDU 传送结束
			    DL_ISDU_T8();  
		}else{   //Idle
			   DL_ISDU_T14();
			   
		}
	
}
 



void DL_ISDU_T2(void){ //开始接收ISDU
   ISDUBuffer_Pointer=0;
   
   memcpy(&ISDUBuferIn[0],MC_STRUCT.OD,MC_STRUCT.OD_Len);
   
   ISDUBuffer_Pointer+=MC_STRUCT.OD_Len; //指针移位，为下次接收做准备
	 FlowCtrl_expected=1; //期望的FlowCtrl=0

   Event_MH_Ready();
}

void DL_ISDU_T3(void){
	  //依据FlowCtrl来判断是否出错
	  
	if(FlowCtrl_expected==0x10){//FlowCtrl循环复位
			FlowCtrl_expected=0;
		}
	  uint8_t flowctrl=(*MC_STRUCT.MC&0x1F);
		
		
	  if(flowctrl!=FlowCtrl_expected){ //通信出错，会导致整个系统重置
			    Event_ISDUError_BOOL();
		}
		else{
	     memcpy(&ISDUBuferIn[ISDUBuffer_Pointer],MC_STRUCT.OD,MC_STRUCT.OD_Len);
       ISDUBuffer_Pointer+=MC_STRUCT.OD_Len;
		   FlowCtrl_expected++;
       Event_MH_Ready();
		}
    
}

void DL_ISDU_T4(void){ //接收ISDU结束
    memset(MC_STRUCT.OD,0,MC_STRUCT.OD_Len);// OD清零
    *MC_STRUCT.OD=0x01;
    Event_MH_Ready();

   Service_DL_ISDUTransport_ind(); //


}

void DL_ISDU_T5(void){
	   //无需在此处判断ISDU Error 或ISDU Abort（已经在OD中通过FlowCtrl判断了）
			
			   memset(MC_STRUCT.OD,0,MC_STRUCT.OD_Len);// OD清零
        *MC_STRUCT.OD=0x01;
         Event_MH_Ready();

    

}

//在准备开始回复后，这里准备第一个数据
void DL_ISDU_T6(void){
    ISDUBuffer_Pointer=0;
	  FlowCtrl_expected=0;
	      
	  memcpy(MC_STRUCT.OD,ISDUBufferOut,MC_STRUCT.OD_Len);
	ISDUBuffer_Pointer+=MC_STRUCT.OD_Len; //为下一帧准备数据
	FlowCtrl_expected++;//为下一帧准备数据
	  Event_MH_Ready();   // 通知主站开始回复
    
}

void DL_ISDU_T7(void){
	
	 	  //首先根据FlowCtrl判断ISDU是Error ，至于Abort已经在OD当中判断了
	  
	if(FlowCtrl_expected==0x10){//FlowCtrl循环复位
			    FlowCtrl_expected=0;
		}
	  uint8_t flowctrl=(*MC_STRUCT.MC&0x1F);
		
		
	  if(flowctrl!=FlowCtrl_expected){ //通信出错，会导致整个系统重置
			        Event_ISDUError_BOOL();
		}
		else{
			       memcpy(MC_STRUCT.OD,&ISDUBufferOut[ISDUBuffer_Pointer],MC_STRUCT.OD_Len);    
           Event_MH_Ready();
		      ISDUBuffer_Pointer+=MC_STRUCT.OD_Len; //为下一帧准备数据
	       FlowCtrl_expected++;//为下一帧准备数据
         //判断是否ISDU发送完，由接收主战的信号决定
			
		}
	
	   
  
    
}

void DL_ISDU_T8(void){
    memset(MC_STRUCT.OD,0,MC_STRUCT.OD_Len);
    Event_MH_Ready();
}

void DL_ISDU_T14(void){
     memset(MC_STRUCT.OD,0,MC_STRUCT.OD_Len);// OD清零
     Event_MH_Ready(); //通知MH准备好了 OD 和 PD
}

 
void DL_ISDU_T9_10_11(void){
     memset(MC_STRUCT.OD,0,MC_STRUCT.OD_Len);// OD清零     
    
	   Event_MH_Ready(); //通知MH准备好了 OD 和 PD
	   Service_DL_ISDUAbort();
}

void DL_ISDU_T13_15_16(void){
    memset(MC_STRUCT.OD,0,MC_STRUCT.OD_Len);// OD清零
     Event_MH_Ready(); //通知MH准备好了 OD 和 PD
     Service_DL_ISDUAbort();
}


